package br.com.cicero.notasfiscais.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;

import br.com.cicero.notasfiscais.infra.JPAUtil;
import br.com.cicero.notasfiscais.modelo.Produto;
import br.com.cicero.notasfiscais.modelo.QuantidadePorProduto;

public class DAO<T> {
	
	private final Class<T> classe;
	
	public DAO(Class<T> classe) {
		
		this.classe = classe;
		
	}
	
	public void adiciona(T t) {
		
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		em.persist(t);
		
		em.getTransaction().commit();
		em.close();
		
	}
	
	public void remove(T t) {
		
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		//Produto obj = (Produto) em.merge(t);
		em.remove(em.merge(t));
		
		em.getTransaction().commit();
		em.close();
				
	}
	
	public void atualiza(T t) {
		
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		em.merge(t);
		
		em.getTransaction().commit();
		em.close();
				
	}
	
	public List<T> listaTodos() {
		
		EntityManager em = new JPAUtil().getEntityManager();
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.select(query.from(classe));
					
		List<T> lista = em.createQuery(query).getResultList();
			
		
		return lista;
		
	}
	
	public T buscaPorId(Long id) {
		
		EntityManager em = new JPAUtil().getEntityManager();
		
		return em.find(classe, id);
				
		
	}

	public List<T> listaTodosPaginada(int inicio, int quantidade) {
		
		EntityManager em = new JPAUtil().getEntityManager();
		Query query = em.createQuery("select n from " + classe.getName() + " n");
		query.setFirstResult(inicio);
		query.setMaxResults(quantidade);
				
		return query.getResultList();
	}

	public int contaTodas() {
		
		EntityManager em = new JPAUtil().getEntityManager();
		
		Query query = em.createQuery("select count(n) from "+ classe.getName() + " n");
		
		Number result = (Number) query.getSingleResult();
		
		
		return result.intValue();
	}
	
	public List<QuantidadePorProduto> relatorioQuantidadePorProduto() {
		
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		return em.createQuery(
				"select new br.com.cicero.notasfiscais.modelo.QuantidadePorProduto(sum(i.quantidade), i.produto) "
				+ " from Item i group by i.produto").getResultList();
		
		
	}
	

}
